<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  
  <title>rocketmq初步学习 | du小站</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="description" content="Apache RocketMQ 是一款低延迟、高并发、高可用、高可靠的分布式消息中间件。消息队列 RocketMQ 可为分布式应用系统提供异步解耦和削峰填谷的能力，同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。">
<meta property="og:type" content="article">
<meta property="og:title" content="rocketmq初步学习">
<meta property="og:url" content="https://wenjies.github.io/2017/09/08/rocketmq%E5%88%9D%E6%AD%A5%E5%AD%A6%E4%B9%A0/index.html">
<meta property="og:site_name" content="du小站">
<meta property="og:description" content="Apache RocketMQ 是一款低延迟、高并发、高可用、高可靠的分布式消息中间件。消息队列 RocketMQ 可为分布式应用系统提供异步解耦和削峰填谷的能力，同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。">
<meta property="og:locale">
<meta property="article:published_time" content="2017-09-08T01:00:00.000Z">
<meta property="article:modified_time" content="2024-12-02T02:14:10.410Z">
<meta property="article:author" content="杰">
<meta property="article:tag" content="rocketmq">
<meta name="twitter:card" content="summary">
  
    <link rel="alternate" href="/atom.xml" title="du小站" type="application/atom+xml">
  
  
    <link rel="shortcut icon" href="/favicon.png">
  
  
  
<link rel="stylesheet" href="/css/style.css">

  
    
<link rel="stylesheet" href="/fancybox/jquery.fancybox.min.css">

  
  
<meta name="generator" content="Hexo 7.3.0"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/" id="logo">du小站</a>
      </h1>
      
        <h2 id="subtitle-wrap">
          <a href="/" id="subtitle">我们笑着说再见，却深知再见遥遥无期。</a>
        </h2>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"><span class="fa fa-bars"></span></a>
        
          <a class="main-nav-link" href="/">Home</a>
        
          <a class="main-nav-link" href="/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
        
          <a class="nav-icon" href="/atom.xml" title="RSS Feed"><span class="fa fa-rss"></span></a>
        
        <a class="nav-icon nav-search-btn" title="Suche"><span class="fa fa-search"></span></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Suche"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="https://wenjies.github.io"></form>
      </div>
    </div>
  </div>
</header>

      <div class="outer">
        <section id="main"><article id="post-rocketmq初步学习" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
  <div class="article-meta">
    <a href="/2017/09/08/rocketmq%E5%88%9D%E6%AD%A5%E5%AD%A6%E4%B9%A0/" class="article-date">
  <time class="dt-published" datetime="2017-09-08T01:00:00.000Z" itemprop="datePublished">2017-09-08</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/MQ/">MQ</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="p-name article-title" itemprop="headline name">
      rocketmq初步学习
    </h1>
  

      </header>
    
    <div class="e-content article-entry" itemprop="articleBody">
      
        <h1 id="RocketMq"><a href="#RocketMq" class="headerlink" title="RocketMq"></a>RocketMq</h1><hr>
<h3 id="RocketMq-特色"><a href="#RocketMq-特色" class="headerlink" title="RocketMq 特色"></a>RocketMq 特色</h3><ol>
<li>强大的消息重试机制</li>
<li>支持 mqadmin 命令管理</li>
<li>模式 多Master no slave、多Master 多 slave</li>
<li>主从策略：同步双写，异步复制</li>
<li>刷盘策略：同步刷盘，异步刷盘（是本节点内 index、 store,commitLong的数据同步）</li>
</ol>
<h3 id="RocketMq-与业术语"><a href="#RocketMq-与业术语" class="headerlink" title="RocketMq 与业术语"></a>RocketMq 与业术语</h3><ol>
<li>Producer: 消息生产者，负责产生消息，一般由业务系统负责产生消息。</li>
<li>Consumer: 消息消费者，负责消费消息，一般是后台系统负责异步消费。</li>
<li>Push Consumer: Consumer 的一种，应用通常吐 Consumer 对象注册一个 Listener 接口，一旦收到消息，Consumer 对象立</li>
<li>Push Consumer: Consumer 的一种，应用通常吐 Consumer 对象注册一个 Listener 接口，一旦收到消息，Consumer 对象立刻回调<br>Listener 接口方法。</li>
<li>Pull Consumer: Consumer 的一种，应用通常主劢调用 Consumer 的拉消息方法从 Broker 拉消息，主劢权由应用控制。</li>
<li>Producer Group: 一类 Producer 的集合名称，返类 Producer 通常収送一类消息，丏収送逡辑一致。</li>
<li>Consumer Group 一类 Consumer 的集合名称，返类 Consumer 通常消费一类消息，丏消费逡辑一致。</li>
<li>Broker: 消息中转角色，负责存储消息，转収消息，一般也称为 Server。在 JMS 规范中称为 Provider。</li>
<li>广播消费: 一条消息被多个 Consumer 消费， 即使返些 Consumer 属亍同一个 Consumer Group， 消息也会被 Consumer Group 中的每个<br>Consumer 都消费一次， 广播消费中的 Consumer Group 概念可以讣为在消息划分方面无意义。在 CORBA Notification<br>规范中，消费方式都属亍广播消费。 项目开源主页：<a target="_blank" rel="noopener" href="https://github.com/alibaba/RocketMQ">https://github.com/alibaba/RocketMQ</a></li>
<li>集群消费 一个 Consumer Group 中的 Consumer 实例平均分摊消费消息。例如某个 Topic 有 9 条消息，其中一个Consumer Group 有<br>3 个实例（可能是 3 个迕程，戒者 3 台机器） ，那举每个实例只消费其中的 3 条消息。在 CORBA Notification 规范中，无此消费方式。在<br>JMS 规范中，JMS point-to-point model 不乀类似，但是 RocketMQ 的集群消费功能大等亍 PTP 模型。<br>因为RocketMQ单个Consumer Group内的消费者类似亍PTP， 但是一个Topic&#x2F;Queue可以被多个Consumer<br>Group 消费。</li>
<li>一个主题下默认有4个Quene 可以修改：p.createTopic</li>
<li>主从实时：保证主节点挂了，也能及时消费该节点的数据，而不用等主节点恢复。</li>
</ol>
<h3 id="RocketMq发送消息例子"><a href="#RocketMq发送消息例子" class="headerlink" title="RocketMq发送消息例子"></a>RocketMq发送消息例子</h3><p><strong><code>普通消息</code></strong></p>
<pre><code>public static void main(String[] args) throws Exception &#123;
    DefaultMQProducer producer = new DefaultMQProducer(&quot;producer&quot;);
    producer.setNamesrvAddr(&quot;127.0.0.1:9876&quot;);
    producer.setRetryTimesWhenSendAsyncFailed(5);//失败重试次数
    producer.start();
    Message msg = new Message(&quot;topic1&quot;, &quot;tag1&quot;, &quot;key1&quot;, (&quot;mess body&quot;).getBytes());
    SendResult sendResult = producer.send(msg);//发送失败 内部自动，重试没有抛异常即为成功。
    System.out.println(sendResult);
    producer.shutdown();
&#125;


public static void main(String[] args) throws MQClientException &#123;
    DefaultMQPushConsumer consumer=new DefaultMQPushConsumer(&quot;consumer&quot;);
    consumer.setNamesrvAddr(&quot;127.0.0.1:9876&quot;);
    consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
    consumer.subscribe(&quot;topic1&quot;, &quot;tag1|tag2|tag1&quot;);
    consumer.registerMessageListener(new MessageListenerConcurrently() &#123;
        public ConsumeConcurrentlyStatus consumeMessage(List&lt;MessageExt&gt; msgs, ConsumeConcurrentlyContext context) &#123;
            for (MessageExt mes : msgs) &#123;
                System.out.println(new String(mes.getBody()));
            &#125;
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        &#125;
    &#125;);
    consumer.start();
&#125;
</code></pre>
<p><strong><code>顺序消息</code></strong></p>
<pre><code>public static void main(String[] args) throws Exception &#123;
    DefaultMQProducer producer = new DefaultMQProducer(&quot;producer&quot;);
    producer.setNamesrvAddr(&quot;127.0.0.1:9876&quot;);
    producer.start();
    Message msg = new Message(&quot;topic1&quot;, &quot;tag1&quot;, &quot;key1&quot;, (&quot;消息内容：aaaa&quot;).getBytes());
    //必须自己实现MessageQueueSelector 保证消息进入同一个队列 arg 队列下标	
    SendResult sendResult = producer.send(msg,new MessageQueueSelector()&#123;
        public MessageQueue select(List&lt;MessageQueue&gt; mqs, Message msg, Object arg) &#123;
            return mqs.get((Integer)arg);
        &#125;
        
    &#125;,0);
    System.out.println(sendResult);
    producer.shutdown();
&#125;


public static void main(String[] args) throws MQClientException &#123;
    DefaultMQPushConsumer consumer=new DefaultMQPushConsumer(&quot;consumer&quot;);
    consumer.setNamesrvAddr(&quot;127.0.0.1:9876&quot;);
    consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
    consumer.subscribe(&quot;topic1&quot;, &quot;*&quot;);
    consumer.setConsumeThreadMin(10);
    consumer.registerMessageListener(new MessageListenerOrderly() &#123;
        public ConsumeOrderlyStatus consumeMessage(List&lt;MessageExt&gt; msgs, ConsumeOrderlyContext context) &#123;
            for (MessageExt mes : msgs) &#123;
                System.out.println(new String(mes.getBody()));
            &#125;
            return ConsumeOrderlyStatus.SUCCESS;
        &#125;
    &#125;);
    consumer.start();
&#125;

顺序消息的实现：1.一组有顺序的消息必须放进同一个队列。
         	  2.一个消费者的一个线程只能接收一个队列的消息 消费者必须是实现，MessageListenerOrderly的监听。
</code></pre>
<p><strong><code>事务消息</code></strong></p>
<pre><code>public static void main(String[] args) throws MQClientException &#123;
    TransactionMQProducer producer = new TransactionMQProducer(&quot;producer&quot;);
    producer.setNamesrvAddr(&quot;127.0.0.1:9876&quot;);
    producer.setTransactionCheckListener(new TransactionCheckListener() &#123;
        public LocalTransactionState checkLocalTransactionState(MessageExt msg) &#123;
            return LocalTransactionState.COMMIT_MESSAGE;
        &#125;
    &#125;);
    producer.start();
    Message msg = new Message(&quot;TransactionTopic&quot;, &quot;tag1&quot;, &quot;key1&quot;, (&quot;消息: aaa a&quot;).getBytes());
    SendResult sendResult = producer.sendMessageInTransaction(msg, new LocalTransactionExecuter() &#123;
        public LocalTransactionState executeLocalTransactionBranch(Message msg, Object arg) &#123;
            System.out.println(msg);
            return LocalTransactionState.COMMIT_MESSAGE;
        &#125;
    &#125;, &quot;回调里的Object arg&quot;);
    System.out.println(sendResult);
    producer.shutdown();
&#125;

public static void main(String[] args) throws MQClientException &#123;
    MQConsumer consumer=new MQConsumer(&quot;consumer&quot;);
    consumer.setNamesrvAddr(&quot;127.0.0.1:9876&quot;);
    consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
    consumer.subscribe(&quot;TransactionTopic&quot;, &quot;*&quot;);
    consumer.setMessageListener(new MessageListenerConcurrently() &#123;
        public ConsumeConcurrentlyStatus consumeMessage(List&lt;MessageExt&gt; msgs, ConsumeConcurrentlyContext context) &#123;
            for (MessageExt mes : msgs) &#123;
                System.out.println(new String(mes.getBody()));
            &#125;
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        &#125;
    &#125;);
    consumer.start();
&#125;
</code></pre>
<p><strong><code>MessageFilter过滤消息</code></strong></p>
<pre><code>public static void main(String[] args) throws Exception &#123;
    DefaultMQProducer producer = new DefaultMQProducer(&quot;producer&quot;);
    producer.setNamesrvAddr(&quot;127.0.0.1:9876&quot;);
    producer.start();
    Message msg = new Message(&quot;topic1&quot;, &quot;tag1&quot;, &quot;key1&quot;, (&quot;mess body&quot;).getBytes());
    SendResult sendResult = producer.send(msg);
    System.out.println(sendResult);
    producer.shutdown();
&#125;

public static void main(String[] args) throws MQClientException &#123;
    DefaultMQPushConsumer consumer=new DefaultMQPushConsumer(&quot;consumer&quot;);
    consumer.setNamesrvAddr(&quot;127.0.0.1:9876&quot;);
    consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
    String code = MixAll.file2String(&quot;H:/code/mq/src/main/java/rocketmq/apt/MesFilter.java&quot;);
    consumer.subscribe(&quot;topic1&quot;,&quot;rocketmq.apt.MesFilter&quot;,code);
    consumer.setConsumeThreadMin(10);
    consumer.registerMessageListener(new MessageListenerConcurrently() &#123;
        public ConsumeConcurrentlyStatus consumeMessage(List&lt;MessageExt&gt; msgs, ConsumeConcurrentlyContext context) &#123;
            for (MessageExt mes : msgs) &#123;
                System.out.println(new String(mes.getBody()));
            &#125;
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        &#125;
    &#125;);
    consumer.start();
&#125;

public class MesFilter implements MessageFilter&#123;
    public boolean match(MessageExt msg) &#123;
        return false;//Determines whether this message is entered fileter
    &#125;

&#125;

注意： MesFilter中不能有汉字
</code></pre>
<h3 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h3><ol>
<li>可能出现重复消息，消费先做判断。</li>
<li>pull类消费,无重试机制（PullMessageService、DefaultMQPullConsumer）</li>
<li>先启动提供者 消费者可能会一次拿多条消息。</li>
<li>一定要先启动消费者，再启动生产者 可以避免很多问题。</li>
<li>消费消息时：<br>1、若mq里有一堆消息那么消费者可能会批量消费 ，可以设置最大消费量为1限制。 （这样好返回消息失败状态，而不是批量状态。避免重复消费）<br>2、消费消息后 可以返回消息状态<br>3、没有返回消息状态的消息会不断重发 无次数限制。<br>4、若返回消息状态是稍后再试，会根据默认 1s、2s、5s…2h发送。<br>消息里有重试次数 （若不想一直重试，可以在重试 多少次后记录日志，返回成功标志。）<br>5、可以设置负载均很、</li>
<li>先启动提供者 在启动 消费者1 在启动消费者2 可能重复消费（1在处理 没有返回，mq会再把消息发给 2）</li>
</ol>
<p>]()</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://wenjies.github.io/2017/09/08/rocketmq%E5%88%9D%E6%AD%A5%E5%AD%A6%E4%B9%A0/" data-id="cm3zc73hv0003l8u6gjje2qnt" data-title="rocketmq初步学习" class="article-share-link"><span class="fa fa-share">Teilen</span></a>
      
      
      
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/rocketmq/" rel="tag">rocketmq</a></li></ul>

    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/2017/09/11/%E8%A7%A3%E5%86%B3%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E5%B8%B8%E7%94%A8%E7%9A%843%E7%A7%8D%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Neuer</strong>
      <div class="article-nav-title">
        
          解决分布式事务常用的3种实现方式
        
      </div>
    </a>
  
  
    <a href="/2017/07/24/java%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%9A%84%E4%B8%80%E4%BA%9B%E6%80%BB%E7%BB%93/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Älter</strong>
      <div class="article-nav-title">java多线程的一些总结</div>
    </a>
  
</nav>

  
</article>


</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Kategorien</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/AJAX/">AJAX</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/JAVA/">JAVA</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/MQ/">MQ</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Mybatis/">Mybatis</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Redis/">Redis</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Spring/">Spring</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/zookeeper/">zookeeper</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1/">分布式事务</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B7%A5%E5%85%B7/">工具</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/">数据库</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E7%BB%8F%E9%AA%8C/">经验</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tags</h3>
    <div class="widget">
      <ul class="tag-list" itemprop="keywords"><li class="tag-list-item"><a class="tag-list-link" href="/tags/aop/" rel="tag">aop</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/bean/" rel="tag">bean</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/hexo/" rel="tag">hexo</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/java/" rel="tag">java</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/js/" rel="tag">js</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/micrometer/" rel="tag">micrometer</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/mvc/" rel="tag">mvc</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/mybatis/" rel="tag">mybatis</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/mysql/" rel="tag">mysql</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/redis/" rel="tag">redis</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/rocketmq/" rel="tag">rocketmq</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/spring/" rel="tag">spring</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/zookeeper/" rel="tag">zookeeper</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/%E4%BA%8B%E5%8A%A1/" rel="tag">事务</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1/" rel="tag">分布式事务</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/" rel="tag">单元测试</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/" rel="tag">基础知识</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1/" rel="tag">定时任务</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/%E6%89%A9%E5%B1%95/" rel="tag">扩展</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/%E6%95%B4%E5%90%88/" rel="tag">整合</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/%E9%9D%A2%E8%AF%95/" rel="tag">面试</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tag Cloud</h3>
    <div class="widget tagcloud">
      <a href="/tags/aop/" style="font-size: 10px;">aop</a> <a href="/tags/bean/" style="font-size: 10px;">bean</a> <a href="/tags/hexo/" style="font-size: 10px;">hexo</a> <a href="/tags/java/" style="font-size: 10px;">java</a> <a href="/tags/js/" style="font-size: 10px;">js</a> <a href="/tags/micrometer/" style="font-size: 10px;">micrometer</a> <a href="/tags/mvc/" style="font-size: 13.33px;">mvc</a> <a href="/tags/mybatis/" style="font-size: 10px;">mybatis</a> <a href="/tags/mysql/" style="font-size: 20px;">mysql</a> <a href="/tags/redis/" style="font-size: 10px;">redis</a> <a href="/tags/rocketmq/" style="font-size: 10px;">rocketmq</a> <a href="/tags/spring/" style="font-size: 10px;">spring</a> <a href="/tags/zookeeper/" style="font-size: 10px;">zookeeper</a> <a href="/tags/%E4%BA%8B%E5%8A%A1/" style="font-size: 10px;">事务</a> <a href="/tags/%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1/" style="font-size: 10px;">分布式事务</a> <a href="/tags/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/" style="font-size: 10px;">单元测试</a> <a href="/tags/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/" style="font-size: 16.67px;">基础知识</a> <a href="/tags/%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1/" style="font-size: 10px;">定时任务</a> <a href="/tags/%E6%89%A9%E5%B1%95/" style="font-size: 10px;">扩展</a> <a href="/tags/%E6%95%B4%E5%90%88/" style="font-size: 10px;">整合</a> <a href="/tags/%E9%9D%A2%E8%AF%95/" style="font-size: 10px;">面试</a>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archiv</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2025/01/">January 2025</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2024/11/">November 2024</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/10/">October 2017</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/09/">September 2017</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/07/">July 2017</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/05/">May 2017</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/12/">December 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/11/">November 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/10/">October 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/08/">August 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/05/">May 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/03/">March 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/02/">February 2016</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">letzter Beitrag</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/2025/01/10/spring%20boot3%E6%95%B4%E5%90%88ELK%E5%AE%9E%E7%8E%B0%E6%97%A5%E5%BF%97%E6%90%9C%E7%B4%A2/">spring boot3整合ELK实现日志搜索</a>
          </li>
        
          <li>
            <a href="/2025/01/10/spring%20boot3%E6%95%B4%E5%90%88%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA/">spring boot3整合链路追踪</a>
          </li>
        
          <li>
            <a href="/2024/11/27/hexo%E4%BD%BF%E7%94%A8/">hexo使用</a>
          </li>
        
          <li>
            <a href="/2017/10/17/spring%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/">spring单元测试</a>
          </li>
        
          <li>
            <a href="/2017/09/16/jsonp%E8%B7%A8%E5%9F%9F%E8%AF%B7%E6%B1%82/">jsonp跨域请求</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      
      &copy; 2025 杰<br>
      <a href="https://beian.miit.gov.cn/" target="_blank">蜀ICP备19041392号-1</a>
    </div>
  </div>
</footer>

    </div>
    <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    


<script src="/js/jquery-3.6.4.min.js"></script>



  
<script src="/fancybox/jquery.fancybox.min.js"></script>




<script src="/js/script.js"></script>





  </div>
</body>
</html>